Alt text

Pour rendre une application vivante, rien de tel qu'un peu d'animation...

Contexte technique

Ce tutorial utilise une approche code-behind où toute la logique est directement dans le fichier XAML.CS.

Voici ce qu'on peut faire

Alt text

Voici ce qu'on va faire

Alt text

XAML

Éléments clés:

XAML.CS

Pour la partie XAML.CS, on procède ainsi:

  1. Définir les propriétés pour l'état de l'animation (rotation active, position, vitesse)
  2. Créer les gestionnaires d'événements pour les boutons de déplacement
  3. Créer la méthode pour gérer le switch de rotation
  4. Créer la méthode pour ajuster la vitesse via le slider
  5. Implémenter les méthodes d'animation directement avec les APIs MAUI

Exemple de structure:

public partial class AnimationPage : ContentPage
{
    private bool rotationActive = false;
    private double currentX = 0;
    private uint animationSpeed = 500; // Vitesse en millisecondes

    public AnimationPage()
    {
        InitializeComponent();
        // Démarrer la rotation continue si activée
        RotateContinuously();
    }

    // Gestionnaire pour le switch de rotation
    private void OnRotationToggled(object sender, ToggledEventArgs e)
    {
        rotationActive = e.Value;
    }

    // Rotation continue en arrière-plan
    private async void RotateContinuously()
    {
        while (true)
        {
            if (rotationActive)
            {
                await box.RotateTo(box.Rotation + 90, animationSpeed);
            }
            await Task.Delay(100);
        }
    }

    // Déplacement vers la gauche
    private async void OnMoveLeft(object sender, EventArgs e)
    {
        currentX -= 50;
        await box.TranslateTo(currentX, 0, animationSpeed);
    }

    // Déplacement vers la droite
    private async void OnMoveRight(object sender, EventArgs e)
    {
        currentX += 50;
        await box.TranslateTo(currentX, 0, animationSpeed);
    }

    // Ajustement de la vitesse
    private void OnSpeedChanged(object sender, ValueChangedEventArgs e)
    {
        animationSpeed = (uint)(51 - e.NewValue) * 10; // Inversion pour que plus = plus rapide
        speedLabel.Text = $"Speed {(int)e.NewValue}";
    }
}

Voici l'implémentation complète des différentes parties du code-behind:

Les propriétés et variables

public partial class AnimationPage : ContentPage
{
    private bool rotationActive = false;
    private double currentX = 0;
    private uint animationSpeed = 500;
}

Ces variables permettent de:

Le constructeur et la rotation continue

public AnimationPage()
{
    InitializeComponent();
    // Démarrer la boucle de rotation en arrière-plan
    RotateContinuously();
}

private async void RotateContinuously()
{
    while (true)
    {
        if (rotationActive)
        {
            // Rotation de 90 degrés à chaque itération
            await box.RotateTo(box.Rotation + 90, animationSpeed);
        }
        // Petite pause pour éviter de surcharger le CPU
        await Task.Delay(100);
    }
}

Points importants:

La méthode pour réagir au switch

private void OnRotationToggled(object sender, ToggledEventArgs e)
{
    rotationActive = e.Value;
}

Cette méthode est appelée quand l'utilisateur change l'état du switch. Elle met simplement à jour la variable rotationActive, et la boucle RotateContinuously() réagira automatiquement.

Les méthodes pour le déplacement

private async void OnMoveLeft(object sender, EventArgs e)
{
    currentX -= 50;
    await box.TranslateTo(currentX, 0, animationSpeed);
}

private async void OnMoveRight(object sender, EventArgs e)
{
    currentX += 50;
    await box.TranslateTo(currentX, 0, animationSpeed);
}

Fonctionnement:

La méthode pour ajuster la vitesse

private void OnSpeedChanged(object sender, ValueChangedEventArgs e)
{
    // Inversion: slider à 50 = vitesse max (100ms), slider à 1 = vitesse min (500ms)
    animationSpeed = (uint)(51 - e.NewValue) * 10;

    // Mise à jour du label pour afficher la valeur du slider
    speedLabel.Text = $"Speed {(int)e.NewValue}";
}

Explication du calcul:

Suite à cet exercice, les compétences suivantes ont été travaillées: